#ifndef NETWORK_API_H
#define NETWORK_API_H

#include <Arduino.h>
#include <ArduinoJson.h>
#include <HTTPClient.h>
#include <WiFi.h>
#include "time.h"

// 配置结构体
struct APIConfig {
    String areaToken;
    String weatherKey;
    unsigned long weatherUpdateInterval;  // 天气更新间隔（毫秒）
};

// 位置信息结构体
struct LocationInfo {
    bool success;
    int code;
    String message;
    String location;
};

// 行政区域信息结构体
struct AreaInfo {
    bool success;
    String message;
    String areaCode;
    String province;
    String city;
    String district;
    double longitude;
    double latitude;
};

// 天气预报结构体
struct WeatherForecast {
    String date;
    String week;
    String dayWeather;
    String nightWeather;
    int highTemp;
    int lowTemp;
    String dayWindDir;
    String dayWindClass;
};

// 实时天气结构体
struct WeatherInfo {
    bool success;
    String message;
    // 位置信息
    String country;
    String province;
    String city;
    String district;
    // 实时天气
    String weather;
    int temperature;
    int feelsLike;
    int humidity;
    String windClass;
    String windDir;
    String updateTime;
    // 预报信息
    WeatherForecast forecasts[5];
};

class NetworkAPI {
public:
    NetworkAPI();
    
    // 配置API参数
    void configure(const APIConfig& config);
    
    // 获取位置信息
    LocationInfo getLocation();
    
    // 获取行政区域信息
    AreaInfo getAreaInfo(const String& location);
    
    // 获取天气信息
    WeatherInfo getWeather(const String& areaCode);
    
    // WiFi连接管理
    bool checkAndReconnectWiFi();
    
    // 检查是否需要更新天气
    bool shouldUpdateWeather();
    
    // 获取上次更新时间
    unsigned long getLastUpdateTime() { return lastWeatherUpdate; }
    
    // 检查响应状态
    bool isValidResponse(int httpCode);
    
    // NTP相关函数
    void initNTP();
    bool syncNTPTime();
    bool isTimeValid();
    String getCurrentTimeStr();
    
private:
    // API URLs
    const char* LOCATION_API_URL;
    const char* AREA_API_URL;
    const char* WEATHER_API_URL;
    
    // 配置参数
    APIConfig config;
    
    // 上次天气更新时间
    unsigned long lastWeatherUpdate;
    
    // NTP相关变量
    bool timeInitialized;
    unsigned long lastNTPSync;
    const unsigned long NTP_SYNC_INTERVAL = 24 * 60 * 60 * 1000; // 24小时同步一次
    
    // 解析JSON响应
    LocationInfo parseLocationResponse(String jsonString);
    AreaInfo parseAreaResponse(String jsonString);
    
    // 天气数据处理
    WeatherInfo parseWeatherResponse(String jsonString);
    WeatherInfo getSimulatedWeather(const String& areaCode);
    bool parseForecastResponse(String jsonString, WeatherInfo &info);
    
    // URL编码辅助函数
    String urlEncode(const String& str);

    // 从URL中提取主机名
    String getHostFromUrl(const String& url);
};

extern NetworkAPI networkAPI;

#endif // NETWORK_API_H 